﻿using System;
using System.IO;
using System.Text;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Collections.Generic;
using WikiDoc.Formatter;
using WikiDoc.Utils;

namespace WikiDoc
{
    /// <summary>
    /// WikiDoc 工具将输入的 XmlDoc 文档中的 Wiki 语法，转换为 Html 语法，
    /// 这样输出的 XmlDoc 文件就能够被 NDoc 等工具继续处理，转换为格式良好的帮助文件。
    /// 
    /// === 使用方法 ===
    /// WikiDoc.exe [XmlDoc文件名]
    /// 
    /// </summary>
    class Program
    {
        public class Argument
        {
            [CmdArgument(UnNamed = true, Required = true)]
            public string Source;

            [CmdArgument(Alias = "e")]
            public string Encode;

            [CmdArgument(Name = "out", Alias = "o")]
            public string OutputPath;

            [CmdArgument(Alias = "r")]
            public bool Replace;
            
            [CmdArgument(Name = "for-summary", Alias = "f")]
            public bool ForSummary;
        }

        /// <summary>
        /// Mains the specified args.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns></returns>
        /// <value></value>
        /// <remarks>
        /// 
        /// </remarks>
        static int Main(string[] args)
        {
            if (args == null || args.Length < 1)
            {
                Console.Error.WriteLine("缺少必需的参数");
                PrintUsage(Console.Out);
                return 1;
            }

            if (args[0] == "/?" || args[0] == "-?" || args[0] == "--help")
            {
                PrintUsage(Console.Out);
                return 0;
            }

            var arguments = new Argument();

            try
            {
                CommandLineArgumentParser.ParseArguments(args, arguments);

                var encode = arguments.Encode == null
                                 ? Encoding.UTF8
                                 : Encoding.GetEncoding(arguments.Encode);

                var xmldoc = File.ReadAllText(arguments.Source, encode);
                var formatter = arguments.ForSummary
                                    ? new XmlDocSummaryFormatter()
                                    : new XmlDocFormatter();
                var translater = new WikiTranslater();

                xmldoc = XmlDocWalker.TranslateXmlDoc(xmldoc, translater, formatter);

                var outfile = arguments.Replace ? arguments.Source : arguments.OutputPath;

                if (outfile == null)
                {
                    Console.WriteLine(xmldoc);
                }
                else
                {
                    using (var writer = new StreamWriter(outfile, false, encode))
                    {
                        writer.Write(xmldoc);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.ToString());
                return 1;
            }

            return 0;
        }

        private static void PrintUsage(TextWriter writer)
        {
            writer.WriteLine(@"
转换指定的 XMLDoc 文件中的 Wiki 语法为 Html 标签。

wikidoc source <Options>

source         指定需要转换的文件

Options:
  -?, --help          显示帮助说明信息
  -r, --replace       替换原有文件，这将忽略 out 参数
  -e, --encode name   指定原文件以及输出文件的编码格式，默认为 utf-8
  -o, --out filename  指定输出文件
  -m, --for-summary   为使输出文件能得到良好的概要提示信息而进行特别处理

如果即未指定 -replace 参数，也未指定 -out 输出文件，则输出到标准输出。

Example：
  wikidoc c:\myprojects\myprog\bin\debug\myprog.xml
  转换 c:\myprojects\myprog\bin\debug\myprog.xml 并输出到标准输出

  wikidoc myprog.xml --replace
  转换 myprog.xml，原文件内容被替换

  wikidoc myprog.xml -o myprog.sum.xml -m
  转换 myprog.xml，输出到 myprog.sum.xml
"
                );
        }
    }
}
